import * as types from './mutation-types'
import {playMode} from 'common/js/config'
import {shuffle} from 'common/js/util'
import {saveSearch, deleteSearch, clearSearch, savePlay, saveFavorite, deleteFavorite} from 'common/js/cache'
// actions.js主要是异步操作，也可以封装一些mutations方法，一起批量改变

function findIndex (list, song) {
  // findIndex()是数组的内置函数，返回传入一个测试条件（函数）符合条件的数组第一个元素位置
  return list.findIndex((item) => {
    return item.id === song.id
  })
}
// 对mutations封装,封装的作用就是便于同时改变几个操作，不是功能上的作用
export const selectPlay = function ({commit, state}, {list, index}) {
  // 提交
  commit(types.SET_SEQUENCE_LIST, list)
  // 判断模式mode是什么模式,如果是随机播放
  if (state.mode === playMode.random) {
    // 洗牌函数改变
    let randomlist = shuffle(list)
    commit(types.SET_PLAYLIST, randomlist)
    // 歌曲索引
    index = findIndex(randomlist, list[index])
    // 否则还是一样是顺序列表
  } else {
    // 播放顺序
    commit(types.SET_PLAYLIST, list)
  }
  // 第几首歌曲，索引
  commit(types.SET_CURRENT_INDEX, index)
  // 播放器打开
  commit(types.SET_FULL_SCREEN, true)
  // 播放状态
  commit(types.SET_PLAYING_STATE, true)
}
// 随机播放封装函数
export const randomPlay = function ({commit}, {list}) {
  // 改变代表模式mode的,把随机播放代表的数字传入进去改变
  commit(types.SET_PLAY_MODE, playMode.random)
  // 播放列表
  commit(types.SET_SEQUENCE_LIST, list)
  let randomlist = shuffle(list)
  // 播放顺序
  commit(types.SET_PLAYLIST, randomlist)
  // 第几首歌曲，索引
  commit(types.SET_CURRENT_INDEX, 0)
  // 播放器打开
  commit(types.SET_FULL_SCREEN, true)
  // 播放状态
  commit(types.SET_PLAYING_STATE, true)
}

// 搜索页面数据被点击改变数据
export const insertSong = function ({commit, state}, song) {
  // 用slice(),取副本就不会修改state里面的值
  let playlist = state.playlist.slice()
  // 用slice(),取副本就不会修改state里面的值
  let sequenceList = state.sequenceList.slice()
  let currentIndex = state.currentIndex
  // 记录当前歌曲
  let currentSong = playlist[currentIndex]
  // 查找当前列表中是否有待插入的歌曲并返回其索引
  let fpIndex = findIndex(playlist, song)
  // 因为是插入歌曲，所以索引+1
  currentIndex++
  // 插入这首歌到当前索引位置
  playlist.splice(currentIndex, 0, song)
  // 如果已经包含了这首歌
  if (fpIndex > -1) {
    // 如果当前插入的序号大于列表中的序号
    if (currentIndex > fpIndex) {
      playlist.splice(fpIndex, 1)
      currentIndex--
    } else {
      playlist.splice(fpIndex + 1, 1)
    }
  }

  let currentSIndex = findIndex(sequenceList, currentSong) + 1

  let fsIndex = findIndex(sequenceList, song)

  sequenceList.splice(currentSIndex, 0, song)

  if (fsIndex > -1) {
    if (currentSIndex > fsIndex) {
      sequenceList.splice(fsIndex, 1)
    } else {
      sequenceList.splice(fsIndex + 1, 1)
    }
  }
  // 播放顺序
  commit(types.SET_PLAYLIST, playlist)
  // 播放列表
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  // 第几首歌曲，索引
  commit(types.SET_CURRENT_INDEX, currentIndex)
  // 播放器打开
  commit(types.SET_FULL_SCREEN, true)
  // 播放状态
  commit(types.SET_PLAYING_STATE, true)
}

// 保存点击歌曲，本地存储
export const saveSearchHistory = function ({commit}, query) {
  // saveSearch自定义的方法是为了，数组中的数据排行，最新存储的放最前面并且保持15个数据的长度
  commit(types.SET_SEARCH_HISTORY, saveSearch(query))
}

// 删除点击歌曲，在本地存储
export const deleteSearchHistory = function ({commit}, query) {
  commit(types.SET_SEARCH_HISTORY, deleteSearch(query))
}

// 全部删除歌曲，在本地存储
export const clearSearchHistory = function ({commit}) {
  // clearSearch返回空数组
  commit(types.SET_SEARCH_HISTORY, clearSearch())
}

// 在列表中删除歌曲
export const deleteSong = function ({commit, state}, song) {
  // 拿到当前的播放列表
  let playlist = state.playlist.slice()
  // 拿到顺序列表
  let sequenceList = state.sequenceList.slice()
  // 拿到当前播放的索引
  let currentIndex = state.currentIndex
  // 在当前的播放列表中找到song歌曲
  let pIndex = findIndex(playlist, song)
  // 数组删除
  playlist.splice(pIndex, 1)
  // 找到索引
  let sIndex = findIndex(sequenceList, song)
  // 直接删除
  sequenceList.splice(sIndex, 1)
  // 如果在删除的索引之后或者删除最后一首歌
  if (currentIndex > pIndex || currentIndex === playlist.length) {
    currentIndex--
  }

  // 提交,改变播放顺序
  commit(types.SET_PLAYLIST, playlist)
  // 提交，改变播放列表
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  // 提交，第几首歌曲，索引
  commit(types.SET_CURRENT_INDEX, currentIndex)

  const playingState = playlist.length > 0

  commit(types.SET_PLAYING_STATE, playingState)
}

// 清空歌曲列表
export const deleteSongList = function ({commit}) {
  // 提交,改变播放顺序
  commit(types.SET_PLAYLIST, [])
  // 提交，改变播放列表
  commit(types.SET_SEQUENCE_LIST, [])
  // 提交，第几首歌曲，索引
  commit(types.SET_CURRENT_INDEX, -1)
  // 播放状态改成关闭
  commit(types.SET_PLAYING_STATE, false)
}

// 记录播放历史
export const savePlayHistory = function ({commit}, song) {
  commit(types.SET_PLAY_HISTORY, savePlay(song))
}

// 添加收藏
export const saveFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, saveFavorite(song))
}
// 删除收藏
export const deleteFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, deleteFavorite(song))
}
